package BasicKnowledge.Basic.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;


/**
 * @time: 2021/2/2/002 13:49
 * @author: Zhurunhe
 */
public class IODemo {
    public static void main(String[] args) throws IOException {
        testIO3();

    }

    public static void testIO1() {
        FileInputStream fileInputStream = null;
        try {
            //1)在当前程序与文件之间创建流通道，读取G:/abc.txt文件，通过构造方法指定要访问的文件，如果文件不存在就会抛出异常
            fileInputStream = new FileInputStream("G:/abc.txt");

            //2）读写内容，read（）方法从文件中读取一个字节，并把读取到的字节返回，读到末尾时返回-1
            int fr = fileInputStream.read();//读取到的是码值
            while (fr != -1) {
                //System.out.println(fr);
                System.out.print((char) fr);//强转为字符
                fr = fileInputStream.read();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //3）关闭通道
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public static void testIO2() {
        //JDK7.0开始可以自动关闭流 try资源块自动释放
        try (FileInputStream fileInputStream = new FileInputStream("G:/abc.txt");) {
            //2)' 一次读取多个字节，保存到字节数组中，返回读取到的字节数,读到末尾时返回-1
            byte[] bytes = new byte[4];
            int len = fileInputStream.read(bytes);
            while (len != -1) {
                //从文件中读取了len个字节保存到byte数组中，对len个字节进行处理
                //把读取到到的len个字节装换为字符串{new String(byte[]bytes ,0,len)
                System.out.print(new String(bytes, 0, len));
                len = fileInputStream.read(bytes);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void testIO3() throws IOException {
        //1)建立通道，通过构造方法的参数指定要访问的文件，
        //如果访问的文件不存在，系统会新建一个文件，若文件存在则会覆盖文件之前的内容,true表示允许覆盖
        FileOutputStream fileOutputStream = new FileOutputStream("G:/bcd.txt",true);
        //2）保存数据 一次写一个字节，

        fileOutputStream.write(65);//把65数字对应的字符A保存到文件中
        fileOutputStream.write(66);//把66数字对应的字符B保存到文件中
        fileOutputStream.write(67);//把67数字对应的字符C保存到文件中
        fileOutputStream.write(68);//把68数字对应的字符D保存到文件中
        //换行，在Windows系统中换行是需要使用\r\n两个字符
        fileOutputStream.write('\r');//回车，13
        fileOutputStream.write('\n');//换行，10

        //一次写一个字节组
        byte[] bytes = "Hello World".getBytes(StandardCharsets.UTF_8);
        fileOutputStream.write(bytes);
        //换行
        fileOutputStream.write(13);
        fileOutputStream.write(10);
        //把字节数组的部分文字保存到文件中。
        int len = bytes.length;
        fileOutputStream.write(bytes, 0, len);


        //3）关闭通道
        fileOutputStream.close();
    }
}
